/*
 * Copyright 2010,2011 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.editor.basis;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Point;

import de.mnit.basis.daten.struktur.gruppe.Gruppe2;
import de.mnit.basis.daten.struktur.tabelle.typ.TypTabelle2;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.dnd.A_DND_Quelle;
import de.mnit.basis.swt.dnd.A_DND_ZielStd;
import de.mnit.basis.swt.dnd.DNDART;
import de.mnit.basis.swt.dnd.DNDTYP;
import de.mnit.basis.swt.dnd.transfer.TextFormatObjekt;
import de.mnit.basis.swt.element.steuer.A_SWT_Steuer;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.SWT_TextEditor;
import de.mnit.basis.swt.statisch.SWT_Zwischenablage;
import de.mnit.basis.sys.Ausgabe;

/**
 * @author Michael Nitsche
 * 16.11.2010	Erstellt
 */
public class Fn_Transfer {

	private SWT_TextEditor editor=null;
	private TextEditor textEditor=null;


	public void init(final TextEditor textEditor, final SWT_TextEditor editor) {
		this.textEditor=textEditor;
		this.editor=editor;

		initCopyPaste();
		initDragNDrop();
	}

	public boolean kopieren() {
		Point auswahl=editor.swt().getSelection();
		if(auswahl.x==auswahl.y)
			return false;

		TypTabelle2<DNDTYP,Object> tt=TypTabelle2.neu(DNDTYP.class, Object.class);

		String[] tf=textEditor.gAuswahl(auswahl);
		tt.plus(DNDTYP.MN_TEXTFORMAT, new TextFormatObjekt(tf[0], tf[1]));

		String text= auswahl.x!=auswahl.y
			? editor.swt().getText(auswahl.x, auswahl.y-1)
			: editor.gText();
		tt.plus(DNDTYP.TEXT, text);

		SWT_Zwischenablage.setze(tt);
		return true;
	}

	public void einfuegen() {
    	Gruppe2<DNDTYP, Object> g=SWT_Zwischenablage.gib(DNDTYP.MN_TEXTFORMAT, DNDTYP.TEXT);

    	if(g==null) // Z.B. wenn STRG+V bei leerer Zwischenablage
    		return;

    	if(g.g1()==DNDTYP.MN_TEXTFORMAT) {
    		TextFormatObjekt tfo=(TextFormatObjekt)g.g2();
    		if(tfo==null)
    			return;
    		textEditor.einfuegen(tfo.text, tfo.format);
    	}
    	else if(g.g1()==DNDTYP.TEXT) {
    		String text=""+g.g2();
    		editor.einfuegen(text);
    	}
	}

	public void ausschneiden() {
		if(kopieren())
			editor.swt().insert("");
	}

	// INTERN

	private void initCopyPaste() {
		// Standardfunktionen deaktivieren:
		editor.swt().setKeyBinding('x' | SWT.MOD1, SWT.NULL);
		editor.swt().setKeyBinding('c' | SWT.MOD1, SWT.NULL);
		editor.swt().setKeyBinding('v' | SWT.MOD1, SWT.NULL);

		editor.eTaste(new KeyListener(){
			public void keyPressed(KeyEvent e) {
				if(e.keyCode=='x' && e.stateMask==SWT.CTRL)
					ausschneiden();
				if(e.keyCode=='c' && e.stateMask==SWT.CTRL)
					kopieren();
				if(e.keyCode=='v' && e.stateMask==SWT.CTRL)
					einfuegen();
			}
			public void keyReleased(KeyEvent e) {
			}
		});
	}

	private void initDragNDrop() {
		editor.sDND_Ziel(new A_DND_ZielStd(DNDTYP.MN_TEXTFORMAT, DNDTYP.TEXT, DNDART.VERSCHIEBEN, DNDART.KOPIE){  // DNDTYP.HTML, DNDTYP.DATEI
			public void aktion(DNDTYP typ, DNDART art, Object o, DropTargetEvent event) {
				Ausgabe.debug(typ, art, o);
				if(typ==DNDTYP.TEXT)
//							t.k_editor.sText(""+o);
					editor.swt().insert(""+o);
				if(typ==DNDTYP.MN_TEXTFORMAT) {
					TextFormatObjekt tfo=(TextFormatObjekt)o;
					if(tfo==null)
						return;
					textEditor.einfuegen(tfo.text, tfo.format);
				}

//				if(typ==DNDTYP.DATEI) { //TODO
//					String[] sa=(String[])o;
//					if(sa==null || sa.length==0) return;
//					try {
//						String text=DateiText.lies(DSDatei.neu(sa[0]));
//						if(text!=null)
////						t.k_editor.sText(text);
//							t.sHTML(text);
//					}
//					catch(F_Sys_Datei e)   { Fehler.direkt("Dateifehler", e, sa); } //Problem, da hier in Klassenimpl
//				}
			}
		});

		editor.sDND_Quelle(new A_DND_Quelle(DNDTYP.MN_TEXTFORMAT, DNDTYP.TEXT, DNDART.KOPIE, DNDART.VERSCHIEBEN){  //TODO HTML
			private Point auswahl;

			public boolean zielOk(A_SWT_Steuer<?, ?> e) {
				auswahl=editor.swt().getSelection();
				return auswahl.x != auswahl.y;
			}

			public Object uebergabe(DNDTYP typ, A_SWT_Steuer<?,?> e) {
//				if(typ==DNDTYP.HTML) return t.gHTML();
				if(typ==DNDTYP.TEXT)
					return auswahl.x!=auswahl.y
						? editor.swt().getText(auswahl.x, auswahl.y-1)
						: editor.gText();
				if(typ==DNDTYP.MN_TEXTFORMAT) {
					String[] tf=textEditor.gAuswahl(auswahl);
					return new TextFormatObjekt(tf[0], tf[1]);
				}
				throw Fehler.sonstige.da_Unmoeglich();
			}

			public void abschluss(DNDTYP typ, DNDART art, A_SWT_Steuer<?, ?> e) {
				int korrektur= editor.swt().getSelection().x<auswahl.x
					? auswahl.y - auswahl.x
					: 0;
				Ausgabe.debug(korrektur);
				if(art==DNDART.VERSCHIEBEN)
					editor.swt().replaceTextRange(auswahl.x+korrektur, auswahl.y - auswahl.x, "");
		        auswahl = null;
			}
		});
	}

}
